Skip to content

feat(mobile): add OpenAI-compatible, OpenRouter LLM and STT provider selection#57

Open
mmaudet wants to merge 3 commits intoCoreWorxLab:mainfrom
mmaudet:feat/mobile-provider-parity
Open

feat(mobile): add OpenAI-compatible, OpenRouter LLM and STT provider selection#57
mmaudet wants to merge 3 commits intoCoreWorxLab:mainfrom
mmaudet:feat/mobile-provider-parity

Conversation

@mmaudet
Copy link
Contributor

@mmaudet mmaudet commented Feb 8, 2026

Summary

  • Add 4 LLM providers in a 2x2 grid (Ollama, Groq, OpenAI Compatible, OpenRouter) with provider-specific config (base URL, API key, model dropdown)
  • Add independent STT provider selection (Speaches / Groq Whisper) with shared API key awareness
  • OpenRouter model picker uses a searchable modal bottom sheet (230+ models)
  • i18n support for all new UI elements (EN, FR, IT)

Bug fix: settings persistence

During manual testing, we identified that test endpoints failed with "Invalid API key" when revisiting settings, because the backend doesn't return secret fields and the test was sent without a key. Fixed by:

  • Backend: test-groq, test-openai-compatible, and test-openrouter endpoints now fall back to the stored API key from settings.json when none is provided
  • Mobile: language dropdown was not syncing _language on change, causing _save() to overwrite the user's selection with the old value

Test plan

  • flutter analyze passes with 0 issues
  • All 4 LLM providers render correctly with their config fields
  • OpenAI-compatible: connection test + model list population works
  • OpenRouter: connection test + searchable model selection works
  • STT provider toggle appears and persists selection
  • Save includes all new fields in the API call
  • Tested with emulator, not yet on a real device

mmaudet and others added 3 commits February 8, 2026 07:02
…selection

Add provider parity with the web frontend:
- 4 LLM providers: Ollama, Groq, OpenAI-compatible, OpenRouter (2x2 grid toggle)
- Independent STT provider selection (Speaches/Groq Whisper)
- OpenAI-compatible: base URL + optional API key + test + model dropdown
- OpenRouter: API key + test + searchable model list
- STT section with shared Groq API key awareness
- i18n keys added for EN/FR/IT (ARB + generated Dart)

Closes CoreWorxLab#54

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
- unawaited_futures: wrap fire-and-forget futures with unawaited()
  (WakelockPlus, Piper download, retry calls)
- discarded_futures: wrap futures in non-async callbacks with unawaited()
  (Navigator.push, EventsListener.dispose, showModalBottomSheet)
- deprecated_member_use: value → initialValue in DropdownButtonFormField
- unnecessary_const: remove redundant const in button.dart

flutter analyze now reports 0 issues.

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…fixes

- Backend test endpoints (groq, openai-compatible, openrouter) now fall
  back to stored API keys when none provided in the request
- OpenRouter model picker uses modal bottom sheet instead of inline list
  to fix tap detection issues in Flutter web
- OpenAI Compatible API key field shows masked hint when key is stored
- Language dropdown uses backend value instead of local provider default
- Language selection syncs _language field to prevent save from overwriting

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant